package com.duoec.doc.controller;

import com.duoec.demo.base.request.BaseIdRequest;
import com.duoec.doc.dto.request.UserSaveRequest;
import com.duoec.doc.dto.response.BasePageResponse;
import com.duoec.doc.dto.response.BaseResponse;
import com.duoec.doc.dto.response.UserDetailDto;
import com.duoec.doc.dto.response.UserDto;
import com.duoec.doc.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;

import javax.validation.constraints.NotEmpty;

/**
 * TEST
 *
 * @author xuwenzhen
 * @chapter 用户管理
 * @section 用户管理2
 * @c1 12
 * @c2 13
 */
@RestController
@RequestMapping("/api/user")
public class UserApiController<T extends BaseIdRequest<Long>> {
    @Autowired
    private UserService userService;

    /**
     * 用户列表2
     * 测试接口，仅用于测试，不可调用，不可Mock
     *
     * @param request 请求参数1
     * @return 用户列表
     * @author xuwenzhen
     * @c 123
     * @no-mock
     * @no-invoke
     * @since 2023
     * @deprecated 废弃测试
     */
    @GetMapping("/list")
    public BaseResponse<BasePageResponse<UserDto>> list(
            @NotEmpty T request
    ) {
        return BaseResponse.error(500, "非常规接口，抛出异常");
    }

    /**
     * 获取用户信息
     *
     * 这里是接口的描述
     *
     * @param request 请求参数2Ï
     * @param <D>     返回类型
     * @return 用户信息
     * @deprecated 这是个测试验证接口，使用Serializable入参，并非常规接口，无法正常调用
     * @no-invoke
     */
    @GetMapping("/get")
    public <D extends UserDto> BaseResponse<D> get(T request) {
        return BaseResponse.error(500, "非常规接口，抛出异常2");
    }

    /**
     * 获取用户详细信息
     *
     * @param id 用户ID
     * @return 用户详细信息
     */
    @GetMapping("/{id:\\d+}")
    public BaseResponse<UserDetailDto> detail(
            @PathVariable long id,
            @RequestHeader("token") String token
    ) {
        return BaseResponse.success(userService.getDetail(id));
    }

    /**
     * 删除用户
     *
     * @param id 用户ID
     * @return 是否成功
     * @disable
     */
    @DeleteMapping("/{id:\\d+}")
    public BaseResponse<Boolean> delete(@PathVariable long id) {
        return BaseResponse.success(userService.delete(id));
    }

    /**
     * 销售话术
     *
     * @link [文档](https://doc.duoec.com)
     * @link https://www.baidu.com
     */
    @GetMapping(value = "/test2", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
    public SseEmitter testSaleVerbal2(
    ) {
        return new SseEmitter();
    }

    /**
     * 保存用户
     */
    @PostMapping
    public BaseResponse<UserDto> save(@RequestBody UserSaveRequest userDto) {
        return BaseResponse.success(userService.save(userDto));
    }
}
